# 导入必要的模块
from http.server import HTTPServer, BaseHTTPRequestHandler
import os

# 定义静态文件处理器类
class StaticFileHandler(BaseHTTPRequestHandler):
    # 处理GET请求的方法
    def do_GET(self):
        try:
            # 安全地处理路径，防止目录遍历攻击
            # 移除查询参数和锚点
            path = self.path.split('?', 1)[0].split('#', 1)[0]
            # 如果路径是根目录，默认提供index.html
            if path == '/':
                path = '/index.html'

            # 从当前目录下的static文件夹提供服务
            # 移除路径开头的斜杠并拼接static目录
            full_path = os.path.join('static', path.lstrip('/'))

            # 检查文件是否存在
            if not os.path.exists(full_path):
                raise FileNotFoundError

            # 以二进制模式打开文件
            with open(full_path, 'rb') as file:
                # 发送HTTP 200状态码
                self.send_response(200)

                # 根据文件扩展名设置Content-type
                ext = os.path.splitext(full_path)[1]
                content_type = self.guess_type(ext)
                self.send_header('Content-type', content_type)
                # 结束头部发送
                self.end_headers()

                # 读取文件内容并写入响应
                self.wfile.write(file.read())

        except FileNotFoundError:
            # 文件不存在时发送404错误
            self.send_error(404, 'File Not Found')

    # 根据文件扩展名猜测MIME类型的方法
    def guess_type(self, ext):
        # 定义常见文件扩展名对应的MIME类型
        mime_types = {
            '.html': 'text/html',
            '.css': 'text/css',
            '.js': 'application/javascript',
            '.png': 'image/png',
            '.jpg': 'image/jpeg',
            '.jpeg': 'image/jpeg',
            '.gif': 'image/gif',
            '.ico': 'image/x-icon',
            '.txt': 'text/plain',
            '.json': 'application/json',
        }
        # 返回对应的MIME类型，默认为二进制流
        return mime_types.get(ext.lower(), 'application/octet-stream')

# 定义服务器地址和端口
server_address = ('', 8000)
# 创建HTTP服务器实例
httpd = HTTPServer(server_address, StaticFileHandler)

# 打印服务器启动信息
print("静态文件服务器运行在 http://localhost:8000")
print("请确保在项目根目录下创建static文件夹并放入文件")
# 启动服务器
httpd.serve_forever()